在 mapDispatchToProps 方法中访问状态
Access State inside of mapDispatchToProps method
我已经使用 redux 编写了一个容器组件,我的 mapDispatchToProps
实现如下所示
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onChange: (newValue) => {
dispatch(updateAttributeSelection('genre', newValue));
dispatch(getTableData(newValue, ownProps.currentYear));
}
}
}
问题是为了获取 TableData,我需要一些其他组件的状态。我怎样才能访问这个方法中的状态对象?
您可以使用 redux-thunk 创建一个单独的 action creator 函数,它可以访问 getState
,而不是在 mapDispatchToProps
:
中定义函数
function doTableActions(newValue, currentYear) {
return (dispatch, getState) => {
dispatch(updateAttributeSelection('genre', newValue));
let state = getState();
// do some logic based on state, and then:
dispatch(getTableData(newValue, currentYear));
}
}
let mapDispatchToProps = (dispatch, ownProps) => {
return {
onChange : (newValue) => {
dispatch(doTableActions(newValue, ownProps.currentYear))
}
}
}
一些不同的方式来组织这些,但类似的东西应该有效。
您可以只使用 redux-thunk 来获取状态。
像这样写一个辅助函数:
const getState = (dispatch) => new Promise((resolve) => {
dispatch((dispatch, getState) => {resolve(getState())})
})
您可以在异步函数或生成器函数中使用它:
const mapDispatchToProps = (dispatch, ownProps) => {
return {
async someFunction() {
const state = await getState(dispatch)
...
}
}
}
可能的方法也是使用 mergeProps
合并 mapState
和 mapDispatch
并允许同时使用两者。
// Define mapState
const mapState = (state) => ({
needeedValue: state.neededValue
})
// Define mapDispatch
const mapDispatch = (dispatch, ownProps) => {
return {
onChange: (newValue, neededValue) => {
dispatch(updateAttributeSelection('genre', newValue));
dispatch(getTableData(newValue, ownProps.currentYear, neededValue));
}
}
}
// Merge it all (create final props to be passed)
const mergeProps = (stateProps, dispatchProps, ownProps) => {
return {
...stateProps, // optional
...dispatchProps, // optional
onChangeWithNeededValue: (newValue) => (
dispatchProps.onChange(
newValue,
stateProps.needeedValue // <<< here the magic happens
)
)
}
}
// Pass mergePros to connect
const MyContainer = connect(mapState, mapDispatch, mergeProps)(MyComponent);
官方文档:react-redux#connect
大型应用程序可能存在性能缺陷:Stack Overflow - Redux 中的性能和 mergeProps
您可以尝试使用:
这允许您在代码中的任何位置获取状态,如下所示:
const localState1 = getState(reducerA.state1)
const localState2 = getState(reducerB.state2)
同样在 mapDispatchToProps 中:
const mapDispatchToProps = dispatch => {
return {
onClick: () => {
dispatch(someAction(getState(moduleA.state1)));
}
};
};
如果你使用过 Thunk Middleware 那么你可以将辅助函数写入你的
Action.Js
export const getSearchedText = () => (dispatch, getState) => {
const { app } = getState();
return app.searchedText;
}
如果你用过容器设计模式,你的属性容器应该在
下面
Container.js
export const mapDispatchToProps = (dispatch, ownProps) => {
return {
setSearch: search => {
var searchedText = dispatch(getSearchedText());
}
}
我已经使用 redux 编写了一个容器组件,我的 mapDispatchToProps
实现如下所示
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onChange: (newValue) => {
dispatch(updateAttributeSelection('genre', newValue));
dispatch(getTableData(newValue, ownProps.currentYear));
}
}
}
问题是为了获取 TableData,我需要一些其他组件的状态。我怎样才能访问这个方法中的状态对象?
您可以使用 redux-thunk 创建一个单独的 action creator 函数,它可以访问 getState
,而不是在 mapDispatchToProps
:
function doTableActions(newValue, currentYear) {
return (dispatch, getState) => {
dispatch(updateAttributeSelection('genre', newValue));
let state = getState();
// do some logic based on state, and then:
dispatch(getTableData(newValue, currentYear));
}
}
let mapDispatchToProps = (dispatch, ownProps) => {
return {
onChange : (newValue) => {
dispatch(doTableActions(newValue, ownProps.currentYear))
}
}
}
一些不同的方式来组织这些,但类似的东西应该有效。
您可以只使用 redux-thunk 来获取状态。 像这样写一个辅助函数:
const getState = (dispatch) => new Promise((resolve) => {
dispatch((dispatch, getState) => {resolve(getState())})
})
您可以在异步函数或生成器函数中使用它:
const mapDispatchToProps = (dispatch, ownProps) => {
return {
async someFunction() {
const state = await getState(dispatch)
...
}
}
}
可能的方法也是使用 mergeProps
合并 mapState
和 mapDispatch
并允许同时使用两者。
// Define mapState
const mapState = (state) => ({
needeedValue: state.neededValue
})
// Define mapDispatch
const mapDispatch = (dispatch, ownProps) => {
return {
onChange: (newValue, neededValue) => {
dispatch(updateAttributeSelection('genre', newValue));
dispatch(getTableData(newValue, ownProps.currentYear, neededValue));
}
}
}
// Merge it all (create final props to be passed)
const mergeProps = (stateProps, dispatchProps, ownProps) => {
return {
...stateProps, // optional
...dispatchProps, // optional
onChangeWithNeededValue: (newValue) => (
dispatchProps.onChange(
newValue,
stateProps.needeedValue // <<< here the magic happens
)
)
}
}
// Pass mergePros to connect
const MyContainer = connect(mapState, mapDispatch, mergeProps)(MyComponent);
官方文档:react-redux#connect
大型应用程序可能存在性能缺陷:Stack Overflow - Redux 中的性能和 mergeProps
您可以尝试使用:
这允许您在代码中的任何位置获取状态,如下所示:
const localState1 = getState(reducerA.state1)
const localState2 = getState(reducerB.state2)
同样在 mapDispatchToProps 中:
const mapDispatchToProps = dispatch => {
return {
onClick: () => {
dispatch(someAction(getState(moduleA.state1)));
}
};
};
如果你使用过 Thunk Middleware 那么你可以将辅助函数写入你的 Action.Js
export const getSearchedText = () => (dispatch, getState) => {
const { app } = getState();
return app.searchedText;
}
如果你用过容器设计模式,你的属性容器应该在
下面Container.js
export const mapDispatchToProps = (dispatch, ownProps) => {
return {
setSearch: search => {
var searchedText = dispatch(getSearchedText());
}
}